#define _CRT_SECURE_NO_WARNINGS


//#include <stack>
//#include <queue>
//#include <iostream>
//
//using namespace std;
//
//void test1()
//{
//	stack<int> s;
//	s.push(1);
//	s.push(2);
//	s.push(3);
//	s.push(4);
//	for (; !s.empty();)
//	{
//		cout << s.top() << endl;
//		s.pop();
//	}
//}
//
//void test2()
//{
//	queue<int> q;
//	q.push(1);
//	q.push(2);
//	q.push(3);
//	q.push(4);
//	for (; !q.empty();)
//	{
//		cout << q.front() << endl;
//		q.pop();
//	}
//}
//
//int main()
//{
//	test2();
//
//	return 0;
//}

//#include <stack>
//#include <queue>
//#include <iostream>
//
//using namespace std;
//
//class MinStack
//{
//private:
//	stack<int> _st;
//	stack<int> _minst;
//public:
//	MinStack() {}
//
//	void push(int val)
//	{
//		if (_minst.empty() || val <= _minst.top())
//		{
//			_minst.push(val);
//		}
//		_st.push(val);
//	}
//
//	void pop()
//	{
//		if (_st.top() == _minst.top())
//		{
//			_minst.pop();
//		}
//		_st.pop();
//	}
//	int top() { return _st.top(); }
//	int getMin() { return _minst.top(); }
//};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */
 //#include <stack>
 //#include <queue>
 //#include <iostream>
 //
 //using namespace std;
 //
 //class Solution
 //{
 //public:
 //    stack<int> scur;
 //    queue<int> qout;
 //    queue<int> qin;
 //    bool IsPopOrder(vector<int>& pushV, vector<int>& popV)
 //    {
 //        for (auto e : pushV)
 //        {
 //            qin.push(e);
 //        }
 //        for (auto e : popV)
 //        {
 //            qout.push(e);
 //        }
 //        for (; !(scur.empty() && qout.empty() && qin.empty());)
 //        {
 //            if (scur.empty())
 //            {
 //                if (qin.empty())
 //                {
 //                    if (!qout.empty())
 //                    {
 //                        return false;
 //                    }
 //                }
 //                else
 //                {
 //                    scur.push(qin.front());
 //                    qin.pop();
 //                }
 //            }
 //            else
 //            {
 //                if (scur.top() == qout.front())
 //                {
 //                    scur.pop();
 //                    qout.pop();
 //                }
 //                else
 //                {
 //                    if (!qin.empty())
 //                    {
 //                        scur.push(qin.front());
 //                        qin.pop();
 //                    }
 //                    else
 //                    {
 //                        return false;
 //                    }
 //                }
 //            }
 //        }   
 //        return true;
 //    }
 //};

#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <cctype>

using namespace std;

class Solution
{
public:
    int evalRPN(vector<string>& tokens)
    {
        int objl = 0, objr = 0;
        stack<int> num;
        for (auto e : tokens)
        {
            if (isdigit(stoi(e)))
            {
                num.push(stoi(e));
            }
            else
            {
                objr = num.top();
                num.pop();
                objl = num.top();
                num.pop();
                switch (*(e.begin()))
                {
                case '+':
                {
                    num.push(objl + objr);
                    break;
                }
                case '-':
                {
                    num.push(objl - objr);
                    break;
                }
                case '*':
                {
                    num.push(objl * objr);
                    break;
                }
                case '/':
                {
                    num.push(objl / objr);
                    break;
                }
                }
            }
        }
        return num.top();
    }
};